![]() |
![]() |
|
rtk 20132013.1.1Vandali 1. podnalogaVandal bi z javne table, ki vsebuje dolg napis Primer:
izpis: ###do########l#### z v#l###a###############do############## NalogaNapiši funkcijo Predpostavi, da se Vhodni podatkiNiza Izhodni podatkiFunkcija vrne vandalizirano različico niza KomentarNa tekmovanju je bilo treba napisati podprogram, ki vandalizirani niz izpiše, ne pa tudi vrne. Vseeno je bilo, katero pojavitev izpiše, v tej nalogi pa mora funkcija vrniti prvo pojavitev. Uradna rešitevdef vandal(t1, t2): """Poišče (morda po delih) niz t2 v nizu t1 ter ostale znake spremeni v #. Vrne vandalizirani niz t1.""" mesto_v_t2 = 0 vandaliziran_niz = '' for znak in t1: if mesto_v_t2 < len(t2) and znak == t2[mesto_v_t2]: mesto_v_t2 += 1 vandaliziran_niz += znak else: vandaliziran_niz += '#' return vandaliziran_niz 2013.1.2Kolera 1. podnalogaV devetnajstem stoletju se še ni kaj dosti vedelo o načinu prenašanja
nalezljivih bolezni. Leta Nekoliko si poenostavimo zemljevid velemesta in denimo, da nas zanima
le območje, ki ga razdelimo na kvadratno mrežo NalogaNapiši funkcijo Vhodni podatkiFunkciji kot parameter podamo datoteko Izhodni podatkiSeznam dolg kolikor je vodnjakov, v katerem je na mestu PrimerPrimer vhodnih podatkov (iz datoteke):
Primer izhodnega podatka glede na zgornje vhodne podatke:
KomentarNa tekmovanju je bilo treba napisati program in ne funkcije. Vhodni podatki so bili enaki, program pa je moral izpisati števila celic, ki pripadajo posameznemu vodnjaku. Uradna rešitevdef povrsine_vodnjakov(koordinate_vodnjakov): """Za vodnjake v vhodni datoteki izračuna, kolikšna površina pripada vsakemu vodnjaku in vrne seznam površin.""" vodnjaki = [] with open(koordinate_vodnjakov, 'r') as vhod: # shranimo koordinate vodnjakov for vrstica in vhod: (x, y) = vrstica.strip().split(' ') vodnjaki.append((int(x), int(y))) povrsine = len(vodnjaki) * [0] # za vsako celico poiščemo najbližji vodnjak for y in range(1, 51): # zemljevid smo razdelili na 50×50 celic for x in range(1, 51): najkrajsa = 50 * 50 + 50 * 50 # vsak kvadrat razdalje dveh celic bo manjši od tega naj_vodnjak = 0 for i in range(len(vodnjaki)): vodnjak = vodnjaki[i] razdalja = (x - vodnjak[0]) ** 2 + (y - vodnjak[1]) ** 2 # če je celica bližje temu vodnjaku od doslej najbližjega vodnjaka, si to zapomnimo if vodnjak == vodnjaki[0] or razdalja < najkrajsa: najkrajsa = razdalja naj_vodnjak = i povrsine[naj_vodnjak] += 1 return povrsine 2013.1.3Kino 1. podnalogaMirko rad hodi v kino (običajnega, z eno samo dvorano), kjer vrtijo filme brez prekinitev enega za drugim. Domov bo šel z avtobusom, vendar pa sovraži stati na postaji in čakati na avtobus. Po vsakem filmu se odloča, ali naj gre na avtobus ali naj pogleda še en film. Pred seboj ima dva seznama:
Prvi film se začne ob trenutku (0,0). Med filmi ni prekinitve. Mirko pogleda vedno vsaj prvi film. Vhodni podatki so taki, da zagotovo lahko dobi avtobus za domov, če pogleda samo prvi film. Rad bi minimiziral čas čakanja na postaji (to med drugim tudi pomeni, da seveda noče ostati v kinu tako dolgo, da bi zamudil še zadnji avtobus). Mirko lahko pride od kina do avtobusne postaje v trenutku, tako da lahko ujame avtobus, čeprav le-ta odpelje ob istem času, ob katerem se konča zadnji film, ki si ga je ogledal. NalogaNapiši funkcijo Vhodni podatkiFunkcija sprejme dva seznama. Prvi seznam Izhodni podatkiFunkcija vrne število filmov, ki naj si jih Mirko ogleda, da bo čim krajši čas čakal na avtobus. Primer
Izkaže se, da je najbolje, če Mirko pogleda tri filme. V tem primeru mora čakati na avtobus 15 minut. Če bi pogledal en film, bi moral čakati 20 minut, po drugem filmu bi moral čakati kar 50 minut, po četrtem filmu pa bi celo zamudil zadnji avtobus (in to za 5 minut). KomentarNa tekmovanju je bilo treba zgolj opisati postopek, ne pa tudi napisati funkcije. Uradna rešitevdef ogledani(vozni_red, filmi): """Glede na dani vozni red in seznam filmov izračuna, koliko filmov naj si ogledamo, da bomo najmanj čakali na avtobus.""" # Najprej čas pretvorimo v minute in ustvarimo nova seznama vozni_red_minute = [] for i in range(len(vozni_red)): vozni_red_minute.append(vozni_red[i][0] * 60 + vozni_red[i][1]) filmi_minute = [] for i in range(len(filmi)): filmi_minute.append((filmi[i][0] * 60 + filmi[i][1])) t = 0 # Smo na začetku časa. a = 0 # številka avtobusa st_ogledanih_filmov = 0 cas_cakanja = 0 for f in range(len(filmi_minute)): t += filmi_minute[f] # Film se konča ob času t, kateri je prvi naslednji avtobus? while a < len(vozni_red_minute): if vozni_red_minute[a] < t: a += 1 else: break if a < len(vozni_red_minute): # Našli smo avtobus. if f == 0 or (vozni_red_minute[a] - t < cas_cakanja): st_ogledanih_filmov = f + 1 cas_cakanja = vozni_red_minute[a] - t return st_ogledanih_filmovMesto objave ob koncu projekta 15.9.2018 |